#include "NodeService.h"
#include <protocol/TBinaryProtocol.h>
#include <server/TSimpleServer.h>
#include <transport/TServerSocket.h>
#include <transport/TBufferTransports.h>
#include <transport/TSocket.h>

using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;

using boost::shared_ptr;
using namespace  ::mp2;
using namespace std;

void print_node(Node n);
int rangecheck_inclusive(int min, int max, int x);
int rangecheck_exclusive(int min, int max, int x);

class WrappedNode {
    private:
        boost::shared_ptr<NodeServiceClient> client;
        boost::shared_ptr<TTransport> transport;
        void init(int port);
        void ensureOpen();
    public:
        Node N;
        WrappedNode(int port);
        WrappedNode(Node& n);
        ~WrappedNode();
        WrappedNode findSuccessor(int id);
        WrappedNode findPredecessor(int id);
        WrappedNode closestPrecedingFinger(int id);
        void notify(const Node& n);
        WrappedNode getSuccessor();
        WrappedNode getPredecessor();
        string getTable(int nodeID);
        string addFile(string filename, string data);
        string putFile(string filename, string data);
        string delFile(string filename);
        string getFile(string filename);
        int precedes(int id);
};
